// import 'package:flutter/material.dart';
//
// void main() {
//   runApp(MyApp());
// }
//
// class MyApp extends StatelessWidget {
//   // This widget is the root of your application.
//   @override
//   Widget build(BuildContext context) {
//     return MaterialApp(
//       title: 'Flutter Demo',
//       theme: ThemeData(
//         // This is the theme of your application.
//         //
//         // Try running your application with "flutter run". You'll see the
//         // application has a blue toolbar. Then, without quitting the app, try
//         // changing the primarySwatch below to Colors.green and then invoke
//         // "hot reload" (press "r" in the console where you ran "flutter run",
//         // or simply save your changes to "hot reload" in a Flutter IDE).
//         // Notice that the counter didn't reset back to zero; the application
//         // is not restarted.
//         primarySwatch: Colors.blue,
//       ),
//       home: MyHomePage(title: 'Flutter Demo Home Page'),
//     );
//   }
// }
//
// class MyHomePage extends StatefulWidget {
//   MyHomePage({Key key, this.title}) : super(key: key);
//
//   // This widget is the home page of your application. It is stateful, meaning
//   // that it has a State object (defined below) that contains fields that affect
//   // how it looks.
//
//   // This class is the configuration for the state. It holds the values (in this
//   // case the title) provided by the parent (in this case the App widget) and
//   // used by the build method of the State. Fields in a Widget subclass are
//   // always marked "final".
//
//   final String title;
//
//   @override
//   _MyHomePageState createState() => _MyHomePageState();
// }
//
// class _MyHomePageState extends State<MyHomePage> {
//   int _counter = 0;
//
//   void _incrementCounter() {
//     setState(() {
//       // This call to setState tells the Flutter framework that something has
//       // changed in this State, which causes it to rerun the build method below
//       // so that the display can reflect the updated values. If we changed
//       // _counter without calling setState(), then the build method would not be
//       // called again, and so nothing would appear to happen.
//       _counter++;
//     });
//   }
//
//   @override
//   Widget build(BuildContext context) {
//     // This method is rerun every time setState is called, for instance as done
//     // by the _incrementCounter method above.
//     //
//     // The Flutter framework has been optimized to make rerunning build methods
//     // fast, so that you can just rebuild anything that needs updating rather
//     // than having to individually change instances of widgets.
//     return Scaffold(
//       appBar: AppBar(
//         // Here we take the value from the MyHomePage object that was created by
//         // the App.build method, and use it to set our appbar title.
//         title: Text(widget.title),
//       ),
//       body: Center(
//         // Center is a layout widget. It takes a single child and positions it
//         // in the middle of the parent.
//         child: Column(
//           // Column is also a layout widget. It takes a list of children and
//           // arranges them vertically. By default, it sizes itself to fit its
//           // children horizontally, and tries to be as tall as its parent.
//           //
//           // Invoke "debug painting" (press "p" in the console, choose the
//           // "Toggle Debug Paint" action from the Flutter Inspector in Android
//           // Studio, or the "Toggle Debug Paint" command in Visual Studio Code)
//           // to see the wireframe for each widget.
//           //
//           // Column has various properties to control how it sizes itself and
//           // how it positions its children. Here we use mainAxisAlignment to
//           // center the children vertically; the main axis here is the vertical
//           // axis because Columns are vertical (the cross axis would be
//           // horizontal).
//           mainAxisAlignment: MainAxisAlignment.center,
//           children: <Widget>[
//             Text(
//               'You have pushed the button this many times:',
//             ),
//             Text(
//               '$_counter',
//               style: Theme.of(context).textTheme.headline4,
//             ),
//           ],
//         ),
//       ),
//       floatingActionButton: FloatingActionButton(
//         onPressed: _incrementCounter,
//         tooltip: 'Increment',
//         child: Icon(Icons.add),
//       ), // This trailing comma makes auto-formatting nicer for build methods.
//     );
//   }
// }

import 'package:flutter/material.dart';
import 'package:flutter_vlc_player/flutter_vlc_player.dart';
import 'package:flutter_tv/auto_focus.dart';
import 'package:dio/dio.dart';
import 'dart:convert';
import 'dart:io';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        visualDensity: VisualDensity.adaptivePlatformDensity,
      ),
      home: MyHomePage(),
    );
  }
}

class TVUrl {
  final String name;
  final String url;

  TVUrl(this.name, this.url);

  TVUrl.fromJson(Map<String, dynamic> json)
      : name = json['name'],
        url = json['url'];

  Map<String, dynamic> toJson() =>
      {
        'name': name,
        'url': url,
      };
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key}) : super(key: key);

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  VlcPlayerController _videoPlayerController;
  bool _menuVisible = true; //是否显示 频道列表
  var _addressMap = <String, String>{}; //名称 地址集合
  var _curAddress = "http://ivi.bupt.edu.cn/hls/cctv1hd.m3u8"; //当前地址

  Future<void> initializePlayer() async {}

  void getAddressList() async{
    var url = 'http://152.136.159.157:8000/tvlist';
    Dio _dio = Dio();
    String result;
    try {
      Response response = await _dio.get(url);//2
      if (response.statusCode == HttpStatus.ok) {
        var data= jsonDecode(response.toString());//3
        var listData = data["list"];
        List urlList = listData.map((m)=>new TVUrl.fromJson(m)).toList();
        _addressMap.clear();
        for(int i=0;i<urlList.length;i++){
          TVUrl tvUrl = urlList[i];
          _addressMap[tvUrl.name]=tvUrl.url;
        }
        setState(() {
        });

      } else {
        result =
        'Error getAddressList status ${response.statusCode}';
        print(result);
      }
    } catch (exception) {
      result =exception.toString();
      print(result);
    }
  }
  List<String> getDataList() {
    return _addressMap.keys.toList();
  }

  List<Widget> getWidgetList() {
    return getDataList().map((item) => getItemContainer(item)).toList();
  }

  Widget getItemContainer(String item) {
    return AutoFocus(
      child: Card(
        color: Color.fromARGB(0, 0, 0, 0),
        child: InkWell(
          splashColor: Colors.blue.withAlpha(30),
          onTap: () async {
            _curAddress = _addressMap[item];
            setState(() {
            });
            await _videoPlayerController.setMediaFromNetwork(
              _curAddress,
              hwAcc: HwAcc.FULL,
            );


            print('Card tapped.'+_curAddress);
          },
          child: Container(
            color: Color.fromARGB(10, 0, 0, 0),
            //width: 100,
            //height: 50,
            child: Center(
                child: Text(item,
                    style: TextStyle(
                        color: Colors.white,
                        fontWeight: FontWeight.bold,
                        fontSize: 25))),
          ),
        ),
      ),
      //列表显示 按下确定 换台
      onEnter: ()async {
        if (_menuVisible) {
          print('Card enter.' + _addressMap[item]);
          _menuVisible = !_menuVisible;
          _curAddress = _addressMap[item];
          setState(() {});
          await _videoPlayerController.setMediaFromNetwork(
            _curAddress,
            hwAcc: HwAcc.FULL,
          );
        }
      },
      //按下菜单
      onMenu: () {
        print('Card menu');
        _menuVisible = !_menuVisible;
        setState(() {});
      },
      //列表隐藏时 选中当前频道 自动换台
      onFocused: () async{
        if (!_menuVisible){
          print('Card focused.' + _addressMap[item]);
          _curAddress = _addressMap[item];
          await _videoPlayerController.setMediaFromNetwork(
            _curAddress,
            hwAcc: HwAcc.FULL,
          );
        }
      },
    );
  }

  @override
  void initState() {
    super.initState();
    _videoPlayerController = VlcPlayerController.network(
      _curAddress,
      hwAcc: HwAcc.FULL,
      autoPlay: true,
      options: VlcPlayerOptions(),
    );

    _addressMap["CCTV-1"] = 'http://ivi.bupt.edu.cn/hls/cctv1hd.m3u8';
    _addressMap["CCTV-2"] = "http://ivi.bupt.edu.cn/hls/cctv2hd.m3u8";
    _addressMap["湖南卫视"] = "http://ivi.bupt.edu.cn/hls/hunanhd.m3u8";

    //获取地址
    getAddressList();
  }

  @override
  void dispose() async {
    super.dispose();
    await _videoPlayerController.stopRendererScanning();
    await _videoPlayerController.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
       // appBar: AppBar(),
        body: Center(
          child: Stack(
            alignment: AlignmentDirectional.bottomStart,
            children: <Widget>[
              VlcPlayer(
                controller: _videoPlayerController,
                aspectRatio: 16 / 9,
                placeholder: Center(child: CircularProgressIndicator()),
              ),
              AnimatedOpacity(
                duration: Duration(milliseconds: 300),
                opacity: _menuVisible ? 1.0 : 0.0,
                child: AutoFocusContainer(
                  child: Container(
                    decoration: BoxDecoration(color: Color(0x90000033)),
                    margin:EdgeInsets.only( top: 0),
                    child: GridView.count(
                      //水平子Widget之间间距
                      crossAxisSpacing: 15.0,
                      //垂直子Widget之间间距
                      mainAxisSpacing: 20.0,
                      //GridView内边距
                      padding: EdgeInsets.all(10.0),
                      //一行的Widget数量
                      crossAxisCount: 6,
                      //子Widget宽高比例
                      childAspectRatio: 2.0,
                      //子Widget列表
                      children: getWidgetList(),
                    ),
                  ),
                ),
              ),
            ],
          ),
        ));
  }
}
